# 二、列表操作

fruits = ["apple","banana","orange"]

# 将 樱桃( cherry ),添加到我喜欢吃的水果列表中

# 思考：如何向列表中添加一个元素：
# fruits[3] = "cherry"    # IndexError: 索引错误
# Tip：在使用列表使用，要关注索引的范围
print(fruits)

# 方法：定义在类中的函数
# 方法和函数的区别：
# 1.函数是定义在模版里的，方法定义在类里
# 2.函数通过 函数名() ， 方法通过 对象.方法名()

# （2.1） ============增加================
# 1.） append()方法:在列表末尾添加元素
fruits = ["apple","banana","orange"]
fruits.append("cherry")
print(fruits)

# 2.） insert()方法: 在指定索引位置添加元素
fruits = ["apple","banana","orange"]
# 在 apple 和 banana中间添加一个cherry
fruits.insert(1,"cherry")
print(fruits)

# 3.） extend()方法 或者 + ，以合并的方式添加元素
fruits = ["apple","banana","orange"]
new_fruits = ["pinguo","xiangjiao","juzi"]
# fruits.extend(new_fruits)
fruits = fruits + new_fruits
print(fruits)

# （2.2） ============修改================
fruits = ["apple","banana","orange"]
# 通过索引找到对应的元素然后进行修改
fruits[1] = "cherry"

# （2.3）============删除================
fruits = ["apple","banana","orange"]
# 1.) 使用pop()方法进行删除,默认删除最后一个元素
fruits.pop()
print("删除列表的最后一个元素：",fruits)

# 2.) 使用pop(索引值)，删除指定索引位置的元素
fruits = ["apple","banana","orange"]
fruits.pop(1)
print("删除索引为1的元素",fruits)

# 3.) 使用remove(元素值)方法，删除第一次出现的某个元素
fruits = ["apple","banana","orange","apple"]
fruits.remove("apple")
fruits.remove("apple")
print(fruits)

# 4.) 使用del保留字删除元素
fruits = ["apple","banana","orange","apple"]
del fruits[0]   # 删除列表指定索引位置的元素
print(fruits)

# （2.4）============查询================
# 1.） 通过len()函数，查询列表的长度
fruits = ["apple","banana","orange","apple"]
print("列表的长度",len(fruits))

# 列表元素索引的最大值 = 列表长度 - 1

# 2.） count()方法，查询某个元素出现的次数
fruits = ["apple","banana","orange","apple"]
print("apple出现的次数：",fruits.count("apple"))

# 3.） index()方法，查询某个元素的索引
fruits = ["apple","banana","orange","apple"]
print("apple的索引为：",fruits.index("apple"))
print("第二个apple的索引为：",fruits.index("apple",1))
# 通过start和stop参数，限制范围，得到某个元素在此范围第一次出现的索引

# 4.） 使用成员运算符（in / not in），查询元素是否存在
fruits = ["apple","banana","orange","apple"]
print("mongo是否在列表中存在？", "mongo" in fruits  )
print("mongo是否在列表中存在？", "mongo" not in fruits  )

# （2.5）============排序================
# 1.） 使用sort（）方法进行排序
numbers = [3,1,2,4,1]
numbers.sort()  # 顺序（从小到大）
print(numbers)

# reverse参数：反转
numbers.sort(reverse=True)  #逆序
print(numbers)

# 字符串能不能排序？ , 字符串按字典序（大小写、ASCII码）
fruits = ["apple","banana","orange","abple"]
fruits.sort()
print(fruits)

# key参数：定义了 “按什么标准进行排序”
# 标准：是一个函数，可以选用内置函数，自定义
fruits = ["apple","banana","juzi","abple"]

# 以字符串的长度进行列表排序
# key = len ，按照长度标准进行排序
fruits.sort(key=len)
print(fruits)

# 以数字的绝对值进行排序
numbers = [-1,2,-5,6,-10]
numbers.sort(key=abs)
print(numbers)

# 2.）sorted()函数进行排序
numbers = [3,1,2,4,1]
sort_numbers = sorted(numbers)
# numbers = sorted(numbers)
print(sort_numbers)

# sort()方法和sorted函数的区别：sorted函数排序后的列表需要一个新的列表保存

# （2.5）============切片================
numbers = [3,1,4,5,2]

# 切片：获取一个列表某几个元素组成的子列表
# 切片语法格式：列表名[start:stop:step]
# start：起始索引
# stop：终止索引，不包含
# step：步长，切片的方向，默认值1（步长为1，正向）

# Tip：起止的方向和切片的方向一致,不一致就是[]

# 研究：起止方法问题：
# 起:0 , 终:3, 步长：(1)      → [3,1,4]
print(numbers[0:3])
# 起:0 , 终:3, 步长：-1       → []
print(numbers[0:3:-1])
# 起:0 , 终:-1, 步长：-1      → []
print(numbers[0:-1:-1])
# 起:-1 , 终:3, 步长：(1)     → []
print(numbers[-1:3])
# 起:2 , 终:1, 步长：-1       → [4]
print(numbers[2:1:-1])

# 研究：步长和起止点数值问题
# 在切片语法里，起止点的索引是可以超过列表长度
numbers = [3,1,4,5,2]

# 起:3 , 终:10, 步长：2      → [5]
print(numbers[3:5:2])

# 结论：从某个索引开始，以某个方向，一直切到最后一个元素，把终点设置在列表正负索引外面一个元素

# 研究：start和stop参数的特殊数值
numbers = [3,1,4,5,2]

# 起：1，终点：切片方向的最后一个元素 , 步长：2 → [1,5]
print(numbers[1::2])    #[1,5]

# 起：切片方向的第一个元素，终点：-4, 步长为-2  → [2,4]
print(numbers[:-4:-2])  #[2,4]
# 起：切片方向的第一个元素，终点：4, 步长为 2  → [3,4]
print(numbers[:4:2])  #[3,4]

# 结论：
#（1） 如果终点是切片方向的最后一个元素，可以省略
#（2） 如果起点是切片方向的第一个元素，可以省略

# 特殊情况：
numbers = [3,1,4,5,2]

print(numbers[::1])         # [3,1,4,5,2]
print(numbers[::-1])        # [2,5,4,1,3]